//+------------------------------------------------------------------+ //| | //| RSI-R2.mq4 - Ver 1.0 @ 03/22/2007 by Bluto | //| | //+------------------------------------------------------------------+ #property copyright "Bluto" #property link "None" #include #include extern double LotSize=0.5; extern int Slippage=3; extern double StopLoss=0; extern double TakeProfit=700; extern double RiskPercent=2.0; extern bool UseMoneyMgmt=true; extern double RSI_Overbought_Value = 85.0; extern double RSI_Oversold_Value = 15.0; int MagicNumber=0; int ticket; int OpenBuyOrders=0; int OpenSellOrders=0; int i; bool Buy_Mode=false, Sell_Mode=false; double RSI_Day_1=0, RSI_Day_2=0, RSI_Day_3=0, SMA200_Day3=0; double MM_MinLotSize=0; double MM_MaxLotSize=0; double MM_LotStep=0; double MM_Decimals=0; double MM_OrderLotSize=0; int MM_AcctLeverage=0; int MM_CurrencyLotSize=0; //pair array ( IBFX mini ) string pairs[] = { "EURUSDm","USDJPYm","GBPUSDm","USDCHFm","EURCHFm","AUDUSDm","USDCADm", "NZDUSDm","EURGBPm","EURJPYm","GBPJPYm","CHFJPYm","GBPCHFm","EURAUDm", "EURCADm","AUDCADm","AUDJPYm","NZDJPYm","AUDNZDm" }; string TradeSymbol,CommentsPairs[]; int Pair = -1; int init() { if ( IsTesting() ) { if ( ArrayResize(pairs,1) != 0 ) pairs[0] = Symbol(); } ArrayCopy (CommentsPairs, pairs); return(0); } int deinit() { return(0); } int start() { //Select Pair from Array Pair = (Pair+1) % ArraySize(pairs); TradeSymbol = pairs[Pair]; //Identify ibfx mini tradesymbol if(iClose(TradeSymbol,1440,0)==0) { TradeSymbol=StringSubstr(TradeSymbol,0,6); } //TradeSymbol MagicNumber Assignment if (TradeSymbol=="AUDCADm" || TradeSymbol=="AUDCAD") {MagicNumber=200001;} if (TradeSymbol=="AUDJPYm" || TradeSymbol=="AUDJPY") {MagicNumber=200002;} if (TradeSymbol=="AUDNZDm" || TradeSymbol=="AUDNZD") {MagicNumber=200003;} if (TradeSymbol=="AUDUSDm" || TradeSymbol=="AUDUSD") {MagicNumber=200004;} if (TradeSymbol=="CHFJPYm" || TradeSymbol=="CHFJPY") {MagicNumber=200005;} if (TradeSymbol=="EURAUDm" || TradeSymbol=="EURAUD") {MagicNumber=200006;} if (TradeSymbol=="EURCADm" || TradeSymbol=="EURCAD") {MagicNumber=200007;} if (TradeSymbol=="EURCHFm" || TradeSymbol=="EURCHF") {MagicNumber=200008;} if (TradeSymbol=="EURGBPm" || TradeSymbol=="EURGBP") {MagicNumber=200009;} if (TradeSymbol=="EURJPYm" || TradeSymbol=="EURJPY") {MagicNumber=200010;} if (TradeSymbol=="EURUSDm" || TradeSymbol=="EURUSD") {MagicNumber=200011;} if (TradeSymbol=="GBPCHFm" || TradeSymbol=="GBPCHF") {MagicNumber=200012;} if (TradeSymbol=="GBPJPYm" || TradeSymbol=="GBPJPY") {MagicNumber=200013;} if (TradeSymbol=="GBPUSDm" || TradeSymbol=="GBPUSD") {MagicNumber=200014;} if (TradeSymbol=="NZDJPYm" || TradeSymbol=="NZDJPY") {MagicNumber=200015;} if (TradeSymbol=="NZDUSDm" || TradeSymbol=="NZDUSD") {MagicNumber=200016;} if (TradeSymbol=="USDCHFm" || TradeSymbol=="USDCHF") {MagicNumber=200017;} if (TradeSymbol=="USDJPYm" || TradeSymbol=="USDJPY") {MagicNumber=200018;} if (TradeSymbol=="USDCADm" || TradeSymbol=="USDCAD") {MagicNumber=200019;} if (MagicNumber==0) {MagicNumber = 200999;} //Assign Symbol Bid/Ask & Point values double bid=MarketInfo(TradeSymbol,MODE_BID); double ask=MarketInfo(TradeSymbol,MODE_ASK); double point=MarketInfo(TradeSymbol,MODE_POINT); //----- Money Management & Lot Sizing Stuff. MM_AcctLeverage = AccountLeverage(); MM_MinLotSize = MarketInfo(TradeSymbol,MODE_MINLOT); MM_MaxLotSize = MarketInfo(TradeSymbol,MODE_MAXLOT); MM_LotStep = MarketInfo(TradeSymbol,MODE_LOTSTEP); MM_CurrencyLotSize = MarketInfo(TradeSymbol,MODE_LOTSIZE); if(MM_LotStep == 0.01) {MM_Decimals = 2;} if(MM_LotStep == 0.1) {MM_Decimals = 1;} if(UseMoneyMgmt == true) { MM_OrderLotSize = AccountEquity() * (RiskPercent * 0.01) / (MM_CurrencyLotSize / MM_AcctLeverage); MM_OrderLotSize = StrToDouble(DoubleToStr(MM_OrderLotSize,MM_Decimals)); } else { MM_OrderLotSize = LotSize; } if(MM_OrderLotSize < MM_MinLotSize) {MM_OrderLotSize = MM_MinLotSize;} if(MM_OrderLotSize > MM_MaxLotSize) {MM_OrderLotSize = MM_MaxLotSize;} //indicator variable value assignments SMA200_Day3 = iMA(TradeSymbol,1440,200,0,0,0,1); RSI_Day_1 = iRSI(TradeSymbol,1440,2,0,3); RSI_Day_2 = iRSI(TradeSymbol,1440,2,0,2); RSI_Day_3 = iRSI(TradeSymbol,1440,2,0,1); //Buy Setup if(RSI_Day_1 < 65 && RSI_Day_2 < RSI_Day_1 && RSI_Day_3 < RSI_Day_2 && iClose(TradeSymbol,1440,1) > SMA200_Day3) { Buy_Mode=true; } else { Buy_Mode=false; } //Sell Setup if(RSI_Day_1 > 35 && RSI_Day_2 > RSI_Day_1 && RSI_Day_3 > RSI_Day_2 && iClose(TradeSymbol,1440,1) < SMA200_Day3) { Sell_Mode=true; } else { Sell_Mode=false; } //Long Position Closing Conditions if(OpenBuyOrders == 1 && iRSI(TradeSymbol,1440,2,0,1) > RSI_Overbought_Value) { CloseLongs(MagicNumber,bid); OpenBuyOrders = 0; } //Short Position Closing Conditions if(OpenSellOrders == 1 && iRSI(TradeSymbol,1440,2,0,1) < RSI_Oversold_Value) { CloseShorts(MagicNumber,ask); OpenSellOrders = 0; } //----- Count number of existing open buy & sell orders; update trailing stops. OpenBuyOrders=0; OpenSellOrders=0; // Manage Paraolic SAR for(i=0;i<=OrdersTotal();i++) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if((OrderSymbol()==TradeSymbol) && (OrderMagicNumber()==MagicNumber)) { if(OrderType()==OP_BUY) { OpenBuyOrders++; if((iSAR(TradeSymbol,1440,0.02,0.2,1)>OrderStopLoss()) && (bid>iSAR(TradeSymbol,1440,0.02,0.2,1)) && (OrderOpenPrice()iSAR(TradeSymbol,0,0.02,0.2,2))) { OrderModify(OrderTicket(), OrderOpenPrice(), iSAR(TradeSymbol,1440,0.02,0.2,1), OrderTakeProfit(),0,Blue); Print("Order # ",OrderTicket()," updated at ",Hour(),":",Minute(),":",Seconds()); return(0); } } if(OrderType()==OP_SELL) { OpenSellOrders++; if((iSAR(TradeSymbol,1440,0.02,0.2,1)iSAR(TradeSymbol,0,0.02,0.2,1)) && (iSAR(TradeSymbol,0,0.02,0.2,1) 0) { CloseShorts(MagicNumber,ask); OpenSellOrders = 0; } if(OpenBuyOrders == 0) { ticket = OpenPendingOrder(OP_BUY,MM_OrderLotSize,ask,Slippage,bid, StopLoss,TakeProfit,"RSI-R2 mp",MagicNumber,0,Lime); if(ticket<0) { Print("OrderSend failed with error #",GetLastError()); return(0); } else { OpenBuyOrders++; } } } if(Sell_Mode==true && OpenSellOrders==0) { if(OpenBuyOrders > 0) { CloseLongs(MagicNumber,bid); OpenBuyOrders = 0; } if(OpenSellOrders == 0) { ticket = OpenPendingOrder(OP_SELL,MM_OrderLotSize,bid,Slippage,ask, StopLoss,TakeProfit,"RSI-R2 mp",MagicNumber,0,HotPink); if(ticket<0) { Print("OrderSend failed with error #",GetLastError()); return(0); } else { OpenSellOrders++; } } } //On Chart Comment function call (displays pair data) CommentAll(SMA200_Day3, RSI_Day_1, RSI_Day_2, RSI_Day_3); return(0); }//end of Start() //----- Comments void CommentAll(double SMA200_Day3, double RSI_Day_1, double RSI_Day_2, double RSI_Day_3) { string Comments = ""; int i, next = (Pair+1) % ArraySize(pairs); CommentsPairs[Pair] = StringConcatenate(TradeSymbol,": ","Last Close ",iClose(TradeSymbol,1440,1), " 200SMA(",SMA200_Day3,") ","RSI(1) ",RSI_Day_1," RSI(2) ",RSI_Day_2," RSI(3) ", RSI_Day_3," Monthly Tick Count: ",iVolume(TradeSymbol,43200,0)); CommentsPairs[next] = ">" + CommentsPairs[next]; for(i=0; i < ArraySize(CommentsPairs); i++) Comments = StringConcatenate(Comments,"\n",CommentsPairs[i]); if(!IsTesting())Comment(/*CommentHeader,*/"Last Tick: ",TimeToStr(CurTime(),TIME_DATE|TIME_SECONDS),"\n", Comments); }// end CommentAll() //----- Order Processing Functions void CloseLongs(int MagicNumber, double bid) { int trade; for(trade=OrdersTotal()-1;trade>=0;trade--) { if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)==false) continue; if(OrderSymbol()!=TradeSymbol||OrderMagicNumber()!=MagicNumber) continue; if(OrderSymbol()==TradeSymbol&&OrderMagicNumber()==MagicNumber) { if(OrderType()==OP_BUY) { OrderClose(OrderTicket(),OrderLots(),bid,Slippage,Blue); } } } }//end CloseLongs void CloseShorts(int MagicNumber, double ask) { int trade; for(trade=OrdersTotal()-1;trade>=0;trade--) { if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)==false) continue; if(OrderSymbol()!=TradeSymbol||OrderMagicNumber()!=MagicNumber) continue; if(OrderSymbol()==TradeSymbol&&OrderMagicNumber()==MagicNumber) { if(OrderType()==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),ask,Slippage,Red); } } } }//end CloseShorts int OpenPendingOrder(int pType,double pLots,double pLevel,int sp,double pr,int sl,int tp,string pComment, int pMagic,datetime pExpiration,color pColor) { double bid=MarketInfo(TradeSymbol,MODE_BID); double ask=MarketInfo(TradeSymbol,MODE_ASK); double point=MarketInfo(TradeSymbol,MODE_POINT); int ticket=0; int err=0; int c = 0; int NumberOfTries = 10; switch (pType) { case OP_BUY: for(c = 0 ; c < NumberOfTries ; c++) { RefreshRates(); ticket=OrderSend(TradeSymbol,OP_BUY,pLots,ask,sp,StopLong(bid,sl,point),TakeLong(bid,tp,point), pComment,pMagic,pExpiration,pColor); if (ticket > 0) break; err=GetLastError(); if(err==0) { break; } else { if(err==4 || err==137 ||err==146 || err==136) { //Busy errors Sleep(5000); continue; } else { //normal error Print("Error Code= ", err); break; } } } break; case OP_SELL: for(c = 0 ; c < NumberOfTries ; c++) { RefreshRates(); ticket=OrderSend(TradeSymbol,OP_SELL,pLots,bid,sp,StopShort(ask,sl,point),TakeShort(ask,tp,point), pComment,pMagic,pExpiration,pColor); if (ticket > 0) break; err=GetLastError(); if(err==0) { break; } else { if(err==4 || err==137 ||err==146 || err==136) { //Busy errors Sleep(5000); continue; } else { //normal error Print("Error Code= ", err); break; } } } break; } return(ticket); }//end OpenPendingOrder double StopLong(double price,int stop,double point) { if(stop==0) return(0); else return(price-(stop*point)); }//end StopLong double StopShort(double price,int stop,double point) { if(stop==0) return(0); else return(price+(stop*point)); }//end StopShort double TakeLong(double price,int take,double point) { if(take==0) return(0); else return(price+(take*point)); }//end TakeLong double TakeShort(double price,int take,double point) { if(take==0) return(0); else return(price-(take*point)); }//end TakeShort // * * * * * * * * END OF CODE * * * * * * * *Q帆v眳9D񄸦偲惣S朜赜襒拥[傛c尒扏rA&睔"唶z■麇Z2d 蜣彠3y乲 邁%"觏 岷詌俛#醿g潍f陠瞢蹃茯2nuB鯘篌 W欆诲~辵政/of寂;娬 O壵濑_脃篛2镧l']:火鐍vO#橘箣柴|戜[暅_31!1ТM皢灎(}0m馴^ 骱皊唤垜ts4Ck7K艮邥 銁嚻碶窵覧獂9 H"D 5籖O甈=怿"kMJ臀==鈧嗋Y[ ?8&-駦KmUT2f隸;釸G1,Kggc w>暞z豹帶欃漹/遧%槮朖T淮鲰u)姝?upT耕Q阞r鎢H4摅<弟鍔秸媌T壀與7?蹏錁~棍蟠閷臛!嘪懯,ㄏ+\]䥺,3$磂~漀趙O0齬絲剃掎辰d畫芤偻阅N宫阏暬禿猷;15}⒈縗}餞蔂╋1K糢卫.eVJ+峔j芯9盳%uべ"^OF坁收6<穤}璦烑 U彥蕫韠橝碹~祐G![=5_; VW%7逽N贵痸紙K~縛"躇I悝羔)2>7/萆蟗.軃q5軁/A苼/K'颿4_溝=ゐ偬|{鯘ゆ=侑jT勜JB3懀Oチ鉸滢qh嚨x 漍 憣n倊4墸s}鲺粽頓g髩蔵5k艡J鋪g櫜賃?>{烼PK钞e籽dw_}<讇0憘扉I踔揊y蛖螣竩hH*J-駥昌榗铧K熐溵u韝`leQ&5渹觫V箆扗⒘雘辕丒燍?/v*{瘖5符n u箈q孮*ヽ7+莔嵺[椒澮[鸦甛驞拳荔釽MO娠yH'n縢頰鲈氳箌L顶垼 V;鼔o畘Vb缲早癗jP靂癵%<陜磲 阊*彟.黌餏1.滊截浒f#燠缺uz:4uX曒:Qvr%尽鋎峜愡蕼 蔿Lj8髧5逹畈许溺k笧橏0Y沃羏%w=陞渔唎蕊幾杒e,mE鸣o祈蚛潩O鵌徛疣鬟鍓k浨玗话E誦馣3:=)m3栄闛&DvD,RR输宧mr2儥]硵肿}盡[ \梓飨}p*毪K\忹M乵)z_袝崜6穅 A藃珊醧N蝫"H鹁濪寷C蘮謫菙#璟 鞲㧏6屛卒K擨遉7幽>,漠i|媏O?峛泾糄杤<[ !BHTfQ鍅>螋b蹺姌&鬠02[嚥 孆溰輡哬俞4觸.跟繋泋兕I}极6猛;Z;郈甊Ql<绍⒓痕#闄瞱~8莨摖髢 cS+铬W3郕,+\襎l芘1壩?LT鈧皍B欞8寮YPfL硜槨竇淉源圜@ヘ%@絧~棤煥=晙U擅"蒀9.测].離uo<襼贙4T嚬勾䶮庲撟筲,梞龢頃h鬾}.儔jy閒瑶-蛒讽嗝'a礪)玀u&/蒳蘙套8D8\整{羲a3M珴嚪2k螳漮跷6涏礛G键覷r閧噟zF淞o炣,驴负X唏r弴Q6縈熗9瑩+J-净PT襤E 3]5 槳s>1e床滒禥牿啉袿р鳰訩J/擐谈菼遢礇-}傪酂Q雈;V黕槌呔掙↓壃猵炳Mv觢6旰%1寠I.閗栮豩類茁8徰 痌黲譯 ;掊Xo塥氻=-8I%i Q㏑{[嵥NGd檐憏闓禊r-9q&weh0G焈!诤:|C竃躜州}76Z蘡蛵D,щ氣簔謓毋\8l閫 5鹺5w鵑`3#33閫謍zw]<顚#姚QJ釗闭a/x巨{肺畖褏謨嬈R瑇渚N1骻懬级簓9C駗埭據-m焃秓︿H摹>龊b,3F:踑媟痰-e鲹w~|嗉E員埙5bdㄦ珸oJ 蚜p=xB&腂右] 堕-叫k9*銽 慆趘蠭齖YfX嘳12?pGJ屛!贓 蒩%}| 繇.(堕?$z<踹:倖y+艮蝢t0z嵆@螗&杀b鷺qS"漂凪披9骶 n杭5缘笉筴6wVP溞望东殢榨栞>L緉bun鈳墾纡燝倪.f銰K1<}巷_蕽軑颒嚔姆V9尩湣F蚕巁#其呋h昫zo 艇k岇n0鑭w$)覯1o wEW^XKh牲鏶踂薽~鉘:淟|悾it﹐飉爉栻甏嬘蓌,* Jm<<瀒]姗/\怬V纏獁EE黋熢颞8崠Y)錙絲﹔I稡7+镐-虌膉$Fr炒麥 ./2A廔9牦蓧?hW堕5机G荴X[駨<阵2H栣u舖诙y7+繗8yL趩甄na箴-┭/刷鯒!僱2.舛憹厮9@h火 龂s陥藸痭蚜簙蠞M歶q:y琬/铘饢g苔鄁呏怏胛灧<7殈咎稼浼g楕[J呖o鐃%M薻n踁%堺P辰3亷VI>[S9SJ9UW伸!絴窏1{yzx薷*i銍 =/鉖綧o淿cfe5\鄽#攥顭{ロA涳揕鳂盙C1&刑麙?溢蜳s畈А靉O溇z }見搫鲒+/m絪01Q玐\f颤浤}舖錱咑 h4哚3團倜/A+%{泌5弤f9烺oW倊軱癐豆褉 '占~荘\昶奋jIj朲蒓蔲兞鎤嵬裌ft讃簗尦鷒+o酵懸鍧弁墚Cd0聏谂粪嘓x15椮[况香隰\_鴙L~5趐l^_死g*rZ垩蕏vlz3&庲 IK篫女約玎谫樱c2 C諡{珖濆XG鋮S:劥z;鍷勨|&KA{tF餁聨钮骰 铯審[忟N妡莯證)穉^